package com.legal.utils;

import java.time.LocalDateTime;
import java.util.Random;

/**
 * NoUtils类提供了生成编号的功能
 */
public class NoUtils {
    /**
     * 生成字符串编号
     * @return 生成的编号字符串
     */
    public static String GetNo(){
        // 获取当前时间
        LocalDateTime t=LocalDateTime.now();
        // 提取年份
        int year = t.getYear();
        // 获取当前时间戳
        long currentTime = System.currentTimeMillis();
        // 根据时间戳种子生成随机数,相同时间戳种子生成的随机数相同
        Random random = new Random(currentTime);
        // 随机数范围是1000-9999,代表编号尾部
        int tail = random.nextInt(9000)+1000;
        // 随机数范围是-5-5,计算偏差
        int i = random.nextInt(11) - 5;
        // 头部
        int head=year+i;
        // 拼接头部和尾部形成最终编号
        String result=head+""+tail;
        return result;
    }

    /**
     * 生成随机数
     * @param digist 表示位数
     * @return 生成的随机数字符串
     */
    public static String getRandomNo(int digist) {
        if (digist <= 0) {
            throw new IllegalArgumentException("位数必须大于0");
        }

        // 使用当前时间戳作为随机种子
        long seed = System.nanoTime(); // 比currentTimeMillis()更精确
        Random random = new Random(seed);

        // 计算最小值和最大值范围
        long min = (long) Math.pow(10, digist - 1);
        long max = (long) Math.pow(10, digist) - 1;

        // 生成指定范围内的随机数
        long randomNumber = min == 0 ? random.nextInt((int) max + 1)
                : min + random.nextInt((int) (max - min + 1));

        // 格式化为指定位数的字符串（补前导零）
        return String.format("%0" + digist + "d", randomNumber);
    }


    /**
     * 可传参的生成编号方法
     * @param prefix 表示前缀
     * @return 带前缀的编号字符串
     */
    public static String GetNo(String prefix){
        // 调用无参方法生成编号
        String s = GetNo();
        // 在编号前添加前缀
        return prefix+s;
    }

    /**
     * 生成1-10的随机数
     * @return
     */
    public static Integer getRandomNum(){
        Random random = new Random();
        return random.nextInt(10);
    }

    /**
     *  生成流水号
     * @param type
     * @return
     */
    public static String getFlowId(Integer type){
        // 获取当前时间
        LocalDateTime t=LocalDateTime.now();
        // 提取年份
        int year = t.getYear();
        String tail = getRandomNo(7);
        String prefix;
        //1-微信, 2-支付宝, 3-银行卡, 4-现金等
        switch (type){
            case 1:
                prefix="WX";
                break;
            case 2:
                prefix="AL";
                break;
            case 3:
                prefix="BC";
                break;
            case 4:
                prefix="CS";
                break;
            default:
                prefix="ZF";
                break;
        }
        return prefix+year+tail;
    }

    /**
     * 生成流水号
     * @param type
     * @return
     */
    public static String getFlowId(String type){
        int t = Integer.parseInt(type);
        return getFlowId(t);
    }

}

